#include <54func.h>
//目标：pthread_join可以回收子线程的资源
//      pthread_cancel可以取消线程，但不是进行立刻取消，而是执行到取消点后取消
//      取消点包括很多：引发阻塞的（select,wait,pause）、与文件相关（open,close,read,writd）、与输入输出相关（printf,scanf）
void *threadFunc(void *arg)
{
    //子线程的主动退出：1、线程入口函数return 2、任意位置 pthread_exit
    while(1){
        //printf("I am child!\n");//会引发子线程取消的取消点（输入输出）
        pthread_testcancel();
    }
    return NULL;
}
int main()
{
    pthread_t tid;
    int ret = pthread_create(&tid,NULL,threadFunc,NULL);
    THREAD_ERROR_CHECK(ret,"pthread_create");
    sleep(1);
    //函数向线程发送一个请求
    printf("you  should dead!\n");
    pthread_cancel(tid);
    //主线程向子线程发送取消请求，子线程不会立马取消，而是收到请求后遇到取消点（这里是printf），则立马取消

    void *retval;
    pthread_join(tid,&retval);//pthread_join:用来回收子线程资源，并接收子线程返回值
    printf("retval = %ld\n",(long)retval);//retval是指针，但是这里看成是long整型，用于接收子线程的返回值，虽然没什么太大的用处

    return 0;
}
